from config import *
from config import make_df_ECB
%matplotlib inline
Le variabili macroeconomiche
In questa prima sezione verranno presentate alcune delle principali variabili macroeconomiche, e si mostrerà come estrarre le serie storiche dai database di Eurostat e BCE utilizzando Python. In ordine, verranno presentate:
1. PIL, ovvero la produzione aggregata dell’economia, indicativo del grado di salute dell’economia 2. tasso di disoccupazione, che riveste fondamentale importanza soprattutto per la FED 3. inflazione, di cruciale rilevanza in Europa, in quanto mantenere la stabilità dei prezzi è il principale compito della BCE
Produzione Aggregata
Definizione
La misura della produzione aggregata nella contabilità nazionale è chiamata prodotto interno lordo, o PIL. Il PIL può essere definito in tre modi equivalenti:- Il PIL è il valore dei beni e dei servizi finali prodotti nell’economia in un dato periodo di tempo
- Il PIL è la somma del valore aggiunto nell’economia in un dato periodo di tempo
- Il PIL è la somma dei redditi dell’economia in un dato periodo di tempo
Dalla definizione (3) deriva che, in una economia, produzione aggregata e reddito aggregato siano sempre uguali
Come si misura il PIL?
Normalmente, le informazioni sono raccolte dalle autorità fiscali di un paese:- Le imprese registrano le proprie vendite
- Le imprese pagano tasse sul valore aggiunto
- Gli individui dichiarano il reddito percepito
PIL nominale e PIL reale
Il PIL nominale è la somma del valore dei beni finali valutati al loro prezzo corrente, dunque la sua crescita è influenzata da I. l’aumento della produzione II. l’aumento dei prezzi. Il PIl reale è la somma del valore dei beni finali valutati a prezzi costanti: di solito si utilizzano i prezzi di un anno di riferimento
PIL pro capite
Spesso, per misurare il tenore di vita in un paese, si utilizza il PIL pro capite, ovvero il PIL reale diviso per la popolazione del paese
# Creazione del DataFrame con i dati del PIL dell'Area Euro
# La chiave specificata corrisponde al PIL reale trimestrale in euro a prezzi concatenati
= 'MNA/Q.Y.I9.W2.S1.S1.B.B1GQ._Z._Z._Z.EUR.LR.N'
PIL_KEY = make_df_ECB(PIL_KEY, 'PIL')
pil
"""
Descrizione della serie:
La serie utilizzata rappresenta il PIL reale dell'Area Euro con dati trimestrali (Q).
I valori sono espressi in miliardi di euro (EUR) a prezzi concatenati (LR), il che significa
che sono corretti per l'inflazione e consentono un confronto diretto nel tempo.
Caratteristiche principali:
- Frequenza: Trimestrale (Q)
- Valuta: Euro (EUR) a prezzi concatenati (LR)
- Area geografica: Area Euro (I9)
- Settore: Settore istituzionale totale (S1)
- Fonte: BCE (Banca Centrale Europea)
- Periodi di interesse:
- Crisi del debito europeo (2009) con una significativa contrazione del PIL.
- Pandemia di Covid-19 (2020) con una forte caduta seguita da una ripresa.
"""
# Creazione del grafico del PIL
pil.plot()'PIL Area Euro', loc='left') # Titolo del grafico posizionato a sinistra
plt.title('Trimestre') # Etichetta dell'asse x
plt.xlabel('PIL (Miliardi di euro, prezzi concatenati)') # Etichetta dell'asse y
plt.ylabel(False) # Nasconde la legenda per migliorare la leggibilità
plt.legend().set_visible(
# Annotazione della crisi del debito europeo (2009)
'Crisi del debito',
plt.annotate(=('2009Q1', pil.loc['2009-01-01']),
xy=(-20, 60), # Offset del testo
xytext='offset points', # Specifica l'offset in punti
textcoords=dict(facecolor='#525252', lw=0.5), # Stile della freccia
arrowprops='#525252') # Colore del testo
color
# Annotazione della pandemia di Covid-19 (2020)
'Pandemia di Covid',
plt.annotate(=('2020Q2', pil.loc['2020-04-01']),
xy=(-40, -40), # Offset del testo
xytext='offset points', # Specifica l'offset in punti
textcoords=dict(facecolor='#525252', lw=1.5), # Stile della freccia
arrowprops='#525252') # Colore del testo
color
# Ottimizzazione del layout per evitare sovrapposizioni
plt.tight_layout() plt.show()
Tasso di crescita del PIL
Spesso, si utilizza il concetto di crescita del PIL per indicare espansioni (periodi di crescita positiva) e recessioni (almeno due trimestri consecutivi di crescita negativa).
Il tasso di crescita del PIL è semplicemente definito come: $ Y_t - Y_{t-1} $
# Creazione del DataFrame con i dati della crescita del PIL reale
# La chiave specificata corrisponde alla crescita del PIL reale trimestrale in termini percentuali
= 'MNA/Q.Y.I9.W2.S1.S1.B.B1GQ._Z._Z._Z.EUR.LR.GY'
REAL_GDP_GROWTH_KEY = make_df_ECB(REAL_GDP_GROWTH_KEY, 'Crescita PIL')
real_gdp_growth
"""
Descrizione della serie:
La serie rappresenta la crescita percentuale del PIL reale dell'Area Euro con dati trimestrali (Q).
Misura il tasso di variazione del PIL rispetto al trimestre precedente, esprimendolo in termini percentuali.
Caratteristiche principali:
- Frequenza: Trimestrale (Q)
- Valuta: Euro (EUR) a prezzi concatenati (LR)
- Indicatore: Crescita percentuale del PIL reale (GY)
- Area geografica: Area Euro (I9)
- Settore: Settore istituzionale totale (S1)
- Fonte: BCE (Banca Centrale Europea)
- Periodi di interesse:
- Crisi del debito europeo (2009) con crescita negativa e recessione prolungata.
- Pandemia di Covid-19 (2020) con una caduta storica seguita da un rimbalzo.
"""
# Creazione del grafico della crescita del PIL
real_gdp_growth.plot()'Crescita del PIL nell\'Area Euro', loc='left') # Titolo del grafico posizionato a sinistra
plt.title('Trimestre') # Etichetta dell'asse x
plt.xlabel('Crescita %') # Etichetta dell'asse y
plt.ylabel(False) # Nasconde la legenda per migliorare la leggibilità
plt.legend().set_visible(
# Aggiunta di una linea orizzontale per evidenziare il valore zero (assenza di crescita)
=0, color='#525252', linestyle='--', linewidth=1)
plt.axhline(y
# Annotazione della crisi del debito europeo (2009)
'Crisi del debito',
plt.annotate(=('2009Q1', real_gdp_growth.loc['2009-01-01']),
xy=(-100, -30), # Offset del testo
xytext='offset points', # Specifica l'offset in punti
textcoords=dict(facecolor='#525252', lw=0.5), # Stile della freccia
arrowprops='#525252') # Colore del testo
color
# Annotazione della pandemia di Covid-19 (2020)
'Pandemia di Covid',
plt.annotate(=('2020Q2', real_gdp_growth.loc['2020-04-01']),
xy=(-150, 10), # Offset del testo
xytext='offset points', # Specifica l'offset in punti
textcoords=dict(facecolor='#525252', lw=1.5), # Stile della freccia
arrowprops='#525252') # Colore del testo
color
# Ottimizzazione del layout per evitare sovrapposizioni
plt.tight_layout() plt.show()
La composizione del PIL
Per comprendere cosa determini la domanda di beni, si può scomporre la produzione aggregata in base alla tipologia di acquirente dei beni. Si possono individuare cinque componenti:- Il consumo (C), ovvero beni e servizi acquistati dai consumatori, ovvero le famiglie
- L’investimento (I) che include l’investimento non residenziale (impianti e macchinari) da parte delle aziende, e l’investimento residenziale da parte delle famiglie
- La spesa pubblica in beni e servizi (G), ovvero i beni acquistati dallo stato e dagli enti pubblici. Si noti che non fanno parte di questa categoria pensioni, servizi assistenziali quali il reddito di cittadinanza, o gli interessi pagati sul debito.
- Importazioni (IM), che entrano nell’equazione con segno negativo
- Esportazioni (X), che entrano nell’equazione con segno positivo
Si ha dunque che: \(Y = C + I + G + (X - IM)\)
Dove spesso si usa parlare di esportazioni nette o saldo commerciale del termine \(X - IM\).
# Definisco le chiavi per i vari indicatori economici relativi all'Italia
# La struttura di ogni chiave segue il formato:
# MNA/Q.Y.IT.W2.S1.S1.B.B1GQ._Z._Z._Z.EUR.V.N
= 'MNA/Q.Y.IT.W2.S1.S1.B.B1GQ._Z._Z._Z.EUR.V.N' # PIL (Prodotto Interno Lordo)
IT_gdp_key
= 'MNA/Q.Y.IT.W0.S1.S1.D.P51G.N11G._T._Z.EUR.V.N' # Investimenti
IT_inv_key
= 'MNA/Q.Y.IT.W0.S1M.S1.D.P31._Z._Z._T.EUR.V.N' # Consumi
IT_cons_key
= 'MNA/Q.Y.IT.W0.S13.S1.D.P3._Z._Z._T.EUR.V.N' # Spesa Pubblica
IT_gov_exp_key
= 'MNA/Q.Y.IT.W1.S1.S1.C.P7._Z._Z._Z.EUR.V.N' # Importazioni
IT_imp_key
= 'MNA/Q.Y.IT.W1.S1.S1.D.P6._Z._Z._Z.EUR.V.N' # Esportazioni
IT_exp_key
# Creo i DataFrame per ogni indicatore economico utilizzando le chiavi
= make_df_ECB(IT_gdp_key, 'GDP') # Prodotto Interno Lordo (PIL)
IT_gdp = make_df_ECB(IT_inv_key, 'INV') # Investimenti
IT_inv = make_df_ECB(IT_cons_key, 'CONS') # Consumi
IT_cons = make_df_ECB(IT_gov_exp_key, 'GOV_EXP') # Spesa Pubblica
IT_gov_exp = make_df_ECB(IT_imp_key, 'IMP') # Importazioni
IT_imp = make_df_ECB(IT_exp_key, 'EXP') # Esportazioni
IT_exp
# Unisco tutti i DataFrame in uno solo per l'analisi aggregata delle spese
import functools as ft
= [IT_gdp, IT_inv, IT_cons, IT_gov_exp, IT_imp, IT_exp]
dfs = ft.reduce(lambda left, right: pd.merge(left, right, left_index=True, right_index=True), dfs)
IT_expenditures
# Calcolo la bilancia commerciale (BOT) come la differenza tra esportazioni e importazioni
'BOT'] = IT_expenditures['EXP'] - IT_expenditures['IMP']
IT_expenditures[
# Creo un grafico a barre impilate per visualizzare la spesa aggregata
= IT_expenditures[['INV', 'CONS', 'GOV_EXP', 'BOT']][-32:].plot.bar(stacked=True, figsize=(9, 5))
ax
# Modifico le etichette dell'asse x per visualizzare l'anno e il trimestre
f'{x.year} Q{x.quarter}' for x in IT_expenditures.index[-32:]])
ax.set_xticklabels([
# Aggiungo il titolo e le etichette degli assi
'Spesa Aggregata - IT')
plt.title('Trimestre')
plt.xlabel('Spesa')
plt.ylabel(
# Aggiungo una legenda con le categorie di spesa
'I', 'C', 'G', 'X-IM', 'Y'],
ax.legend([='Categorie',
title='upper left',
loc=True,
frameon='x-small',
fontsize=4
ncol
)
# Adatto il layout per evitare sovrapposizioni
plt.tight_layout()
PIL e PNL
In alcuni casi, è utile distinguere tra:
PIL, che misura il valore totale dei beni e servizi prodotti all’interno di un paese, indipendentemente dalla proprietà delle risorse e PNL (Prodotto Nazionale Lordo), che misura il valore totale dei beni e servizi prodotti da cittadini di un paese, indipendentemente da dove si trovino nel mondo.
Sono emblematici il caso tedesco e quello irlandese.
# Definiamo le colonne di interesse per i dati
= ['geo\TIME_PERIOD', '2020', '2021', '2022', '2023']
cols
# Otteniamo i dati del Prodotto Nazionale Lordo (PNL) pro capite
= eurostat.get_data('nama_10_pp') # Recupera i dati dal database Eurostat
gni_pc_tuples = pd.DataFrame(gni_pc_tuples[1:], columns=gni_pc_tuples[0]) # Crea il DataFrame
gni_pc = gni_pc[cols] # Seleziona solo le colonne di interesse
gni_pc = ['COUNTRY', '2020', '2021', '2022', '2023'] # Rinomina le colonne per chiarezza
gni_pc.columns
# Otteniamo i dati del Prodotto Interno Lordo (PIL) pro capite
= eurostat.get_data('nama_10_pc') # Recupera i dati del PIL pro capite
gdp_pc_tuples = pd.DataFrame(gdp_pc_tuples[1:], columns=gdp_pc_tuples[0]) # Crea il DataFrame
gdp_pc = gdp_pc.query("unit=='CP_PPS_EU27_2020_HAB' & na_item == 'B1GQ'") # Filtro per unità e tipo di dato
gdp_pc = gdp_pc[cols] # Seleziona solo le colonne di interesse
gdp_pc = ['COUNTRY', '2020', '2021', '2022', '2023'] # Rinomina le colonne
gdp_pc.columns
# Definiamo la lista dei paesi per i quali vogliamo visualizzare i dati
= ['IT', 'DE', 'IE']
countries
# Creiamo un grafico a sottotrame per visualizzare i dati
= plt.subplots(1, 3, sharey=True, figsize=(9, 4)) # Crea 3 sottotrame affiancate
fig, axs = axs.flatten() # Appiattisce l'array di assi per facilitare l'accesso
axs
# Ciclo sui paesi per plottare i dati di ciascuno
for n, country in enumerate(countries):
# Selezioniamo i dati del paese corrente per PNL e PIL
= gni_pc[gni_pc['COUNTRY'] == country].T[1:] # Trasposta dei dati di PNL
gni_pc_country = gdp_pc[gdp_pc['COUNTRY'] == country].T[1:] # Trasposta dei dati di PIL
gdp_pc_country
# Plottiamo i dati sulla stessa sottotrama
='PNL pro capite') # PNL
axs[n].plot(gni_pc_country, label='PIL pro capite') # PIL
axs[n].plot(gdp_pc_country, label
# Aggiungiamo il titolo e le etichette
='left') # Titolo a sinistra per ogni paese
axs[n].set_title(country, loc'Anno') # Etichetta asse X
axs[n].set_xlabel('Valore') # Etichetta asse Y
axs[n].set_ylabel(
# Aggiungiamo la legenda
axs[n].legend(='upper left', # Posizione della legenda
loc=True, # Abilita il frame della legenda
frameon='x-small' # Font di dimensioni piccole
fontsize
)
# Titolo principale del grafico
'PIL e PNL pro capite in Italia, Germania, Irlanda')
fig.suptitle(
# Miglioriamo il layout per evitare sovrapposizioni
plt.tight_layout()
# Mostriamo il grafico
plt.show()
Tasso di disoccupazione
Il tasso di disoccupazione si calcola come rapporto tra disoccupati (ovvero coloro i quali non hanno un lavoro, ma lo stanno cercando) e la forza lavoro (data dalla somma di occupati e disoccupati). A questo proposito, è importante sottolineare come chi non ha un lavoro, ma non ne sta nemmeno cercando uno, sia considerato fuori dalla forza lavoro, e dunque non incluso nel conteggio dei disoccupati. Si può quindi calcolare il tasso di partecipazione come forza lavoro divisa per il totale della popolazione.
Come si misura il tasso di disoccupazione?
Generalmente, si effettuano indagini a campione sulle famiglie (Labour Force Surveys)
# Chiave per il tasso di disoccupazione
= 'LFSI/Q.I9.S.UNEHRT.TOTAL0.15_74.T' # Codice identificativo del tasso di disoccupazione
unemp_rate_key = make_df_ECB(unemp_rate_key, 'Unemployment Rate') # Ottieni i dati dal database ECB
unemp_rate
# Creiamo un grafico con due assi
= plt.subplots() # Crea una figura e un asse
fig, ax1
# Plot del tasso di disoccupazione
# Traccia il grafico del tasso di disoccupazione
ax1.plot(unemp_rate) 'Trimestre') # Etichetta per l'asse X
ax1.set_xlabel('Tasso di Disoccupazione', color=bmh_colors[0]) # Etichetta per l'asse Y con colore personalizzato
ax1.set_ylabel(
# Creiamo un secondo asse per la crescita del PIL
= ax1.twinx() # Crea un secondo asse Y condiviso sull'asse X
ax2 >= unemp_rate.index.min()], color='#525252', linestyle=':') # Traccia il grafico della crescita del PIL con linea tratteggiata
ax2.plot(real_gdp_growth[real_gdp_growth.index 'Crescita del PIL') # Etichetta per l'asse Y della crescita del PIL
ax2.set_ylabel(False) # Disabilita la griglia per il secondo asse
ax2.grid(
# Titolo del grafico
'Disoccupazione e crescita del PIL nell\'Area Euro', loc='left') # Aggiungi il titolo a sinistra
plt.title(
# Ottimizza il layout per evitare sovrapposizioni
fig.tight_layout()
# Mostra il grafico
plt.show()
Tasso di Inflazione
L’inflazione rappresenta un aumento sostenuto del livello generale dei prezzi. Il tasso di inflazione è il tasso a cui il livello dei prezzi aumenta nel tempo.
Come si misura l’inflazione?
Il livello dei prezzi si può calcolare in due modi:- Utilizzando il deflatore del PIL, ovvero il rapporto tra il PIL nominale e il PIL reale nell’anno di interesse
- Lindice armonizzato dei prezzi al consumo, ovvero un numero indice che fissa un prezzo pari a 100 nell’anno base
Chiamando \(P_t\) il livello generale dei prezzi nell’anno \(t\), segue che il tasso di inflazione \(\pi\) viene definito come \(\pi = \frac{P_t - P_{t-1}}{P_{t-1}} \approx \ln P_t - \ln P_{t-1}\)
# Chiave per l'Inflation Rate
= 'ICP/M.U2.N.000000.4.ANR' # Codice identificativo dell'Inflation Rate
HICP_key = make_df_ECB(HICP_key, 'Inflation Rate') # Ottieni i dati dal database ECB
HICP
# Creiamo il grafico
= plt.subplots() # Crea una figura e un asse
fig, ax
# Traccia l'inflazione
# Traccia il grafico dell'inflazione
ax.plot(HICP)
# Imposta etichetta per l'asse X e Y
'Trimestre') # Etichetta per l'asse X
ax.set_xlabel('Tasso di Inflazione') # Etichetta per l'asse Y
ax.set_ylabel(
# Titolo del grafico
'Tasso di Inflazione nell\'Area Euro', loc='left') # Aggiungi il titolo a sinistra
plt.title(
# Ottimizza il layout per evitare sovrapposizioni
fig.tight_layout()
# Mostra il grafico
plt.show()